package LeeJS;

public class J22_preivateConstructor {
	//커밋용
	/*
			
			private 으로 선언된 생성자
			일반적으로 모든 생성자는 public 이어야 함
			클래스에 대한 객체를 생성하려면 반드시 필요한 것이 생상자이기 때문임
			
			하지만, 어떤 생성자는 private 으로 만들어서 new 연산자로 
			그들의 클래스가 개체화되지 못하게 하는 경우도 있음
			private 생성자를 사용한 클래스를 singleton 클래스라 부름
			
			생성자는 private 으로 선언
			객체 변수는 private static 으로 선언해서 
			클래스의 객체를 메서드를 통해 접근 가능
			
	 */
	
	public static void main(String[] args) {
		
		/*
		
			Singleton one = new Singleton();
			Singleton two = new Singleton();
			Singleton three = new Singleton();
		
		*/
		
		Singleton one = Singleton.newInstance();
		Singleton two = Singleton.newInstance();
		Singleton three = Singleton.newInstance();
		
	}

}

class Singleton {
	
	private static Singleton object = null;
	
	//object 는 static 으로 선언되었기 때문에 단 하나의 객체만 생성가능
	
	/*
		
		public Singleton() {
		
		System.out.println("객체가 하나 만들어졌어요");
		
	}		//일반적인 생성자
	
	*/
	
	private Singleton() {
		
		System.out.println("객체가 하나 만들어졌어요");
		
	}		//특수한 생성자
	
	/*
	
	public static Singleton newInstance(){
		
		Singleton object = new Singleton();
		
		return object;
	
	}		//셍성자는 일반메서드를 통해서만 호출
	
	*/
	
	/*
	
	public static Singleton newInstance(){
		
		Singleton object = null;
		
		if(object == null) object = new Singleton();
		
		return object;
	
	}
	
	*/
	
	
	public static Singleton newInstance(){
		
		if(object == null) object = new Singleton();
		//객체가 만들어 지지 않았다면(object == null)
		//객체를 하나 생성함(new Singleton)
		
		return object;
	
	}
	
}